// https://www.acwing.com/problem/content/788/

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>
using namespace std;

pair<int, int> partition(vector<int>& nums, int left, int right) {
    // 随机选一个 pivot 下标（避免最坏情况）
    const int index = (int) random() % (right - left + 1) + left;
    swap(nums[index], nums[left]);  // 将 pivot 移到左端
    const int key = nums[left];     // 选定的 pivot 值
    const int start = left;         // 记录最初的 pivot 位置
    int mid = start + 1;            // mid 用于扫描右侧元素

    // 三路划分：< key | == key | > key
    while (mid <= right) {
        if (nums[mid] < key) {
            // 把小于 pivot 的数挪到左边区间
            swap(nums[++left], nums[mid++]);
        } else if (nums[mid] > key) {
            // 把大于 pivot 的数挪到右边区间
            swap(nums[mid], nums[right--]);
        } else {
            // 等于 pivot 的直接跳过
            mid++;
        }
    }
    // 把 pivot 放回中间“等于区域”的起始处
    swap(nums[left], nums[start]);
    // 返回“等于 key 区间”的左右边界
    return {left, right};
}

int quick_select(vector<int>& nums, int left, int right, int k) {
    if (left == right) {
        // 只剩一个元素，直接返回
        return nums[left];
    }

    auto p = partition(nums, left, right);
    int left_end = p.first - 1;     // 小于 pivot 区间的结束位置
    int right_start = p.second + 1; // 大于 pivot 区间的开始位置

    if (k <= left_end) { // 剪枝，三条路径只会走一条路径
        // 第 k 小在左侧递归查找
        return quick_select(nums, left, left_end, k);
    } else if (k > p.second) {
        // 第 k 小在右侧递归查找
        return quick_select(nums, right_start, right, k);
    } else {
        // 第 k 小在等于 pivot 的区间中
        return nums[p.first];
    }
}

int main() {
    int n, k;
    scanf("%d %d", &n, &k);
    vector<int> nums(n);

    for (int i = 0; i < n; i++) {
        scanf("%d", &nums[i]);
    }

    int result = quick_select(nums, 0, n - 1, k-1);
    printf("%d\n", result);

    return 0;
}

/*
10 10
50 43 63 97 30 89 89 94 30 33

[97]
*/